package com.itheima.advance.reflect.demo04;

import java.lang.reflect.Method;

/**
 * 演示：通过反射获取某一个成员方法对象并进行使用
 */
public class ReflectDemoo02 {

    public static void main(String[] args) throws Exception {

        // 1. 获取字节码文件对象
        Class studentClazz = Class.forName("com.itheima.advance.reflect.demo04.Student");

        // 2. 获取function1方法对象并进行使用
        Method function1 = studentClazz.getDeclaredMethod("function1");

        /**
         * 之前调用Student类中的function1方法：Student s = new Student();  s.function1() ;
         * public Object invoke​(Object obj, Object... args): 执行这个方法
         * obj: 调用这个方法所需要的Student对象
         * args: 调用这个方法时所传递的具体的实际参数
         *
         * invoke方法的返回值代表的就是执行完目标方法以后返回的那个结果
         */
        Student s1 = (Student)studentClazz.newInstance();
        function1.invoke(s1) ;                  // 调用s1对象的function1这个方法

        System.out.println("-------------------------------------------");

        // 获取function2方法对象并进行使用: public void function2(String name)
        Method function2 = studentClazz.getDeclaredMethod("function2", String.class);
        function2.invoke(s1 , "张三") ;

        System.out.println("-------------------------------------------");

        // 获取function3方法对象并进行使用: public String function3()
        Method function3 = studentClazz.getDeclaredMethod("function3");
        String result = (String)function3.invoke(s1);
        System.out.println(result);

        System.out.println("-------------------------------------------");

        // 获取function4方法对象并进行使用: public String function4()
        Method function4 = studentClazz.getDeclaredMethod("function4", String.class);
        String resultFun4 = (String)function4.invoke(s1, "李四");
        System.out.println(resultFun4);


        // 获取私有的show方法并进行使用： private void show()
        Method show = studentClazz.getDeclaredMethod("show");
        show.setAccessible(true);
        show.invoke(s1) ;

    }

}
